/*
    通讯录服务端服务的定义，支持对通讯录的所有操作，用于控制业务层逻辑
    1. 添加联系人
    2. 删除联系人
    3. 查看联系人
    4. 查看联系人列表
*/
#pragma once
#include <fstream>
#include "../common/base_response.pb.h"
#include "../common/add_contacts.pb.h"
#include "../common/httplib.h"
#include "../common/contacts_expection.hpp"
#include "../utils/utils.hpp"

class ContactsServer
{
public:
    // 添加联系人
    static void AddContacts(const add_contacts::AddContactsRequest& request, add_contacts::AddContactsResponse& response)
    {
        std::fstream output("../data/address_book.bin", std::ios::binary | std::ios::out | std::ios::app);
        if(output)
        {
            bool res = request.SerializeToOstream(&output);
            if(res)
            {
                response.set_uid(UUIDGenerator::GenerateHex(16));
                base_response::BaseResponse* base_response_ptr = response.mutable_base_response();
                base_response_ptr->set_success(true);
                base_response_ptr->set_error_desc("操作成功");
                std::cout << "添加联系人成功, 联系人uid: " << response.uid() << std::endl;
            }
            else
            {
                throw ContactsException("联系人序列化到文件失败");
            }
        }
        else
        {
            throw ContactsException("address_book.bin文件打开失败");
        }
    }

    // 删除联系人
    static void DeleteContacts(const add_contacts::AddContactsRequest& request)
    {

    }

    // 查看联系人
    static void QueryContacts(const add_contacts::AddContactsRequest& request)
    {

    }

    // 查看联系人列表
    static void QueryContactsList(const add_contacts::AddContactsRequest& request)
    {
        
    }
};